跳到主要内容

select 语句

group by 子句,分组查询
----------------

对查询结果(已经通过where子句过滤之后的数据),按照某个字段,进行分组!

group by 字段!

在分组的结果中,只会显示组内的头一条记录!因此,通常,分组之后的数据,除了分组的字段外,其他字段的逻辑含义很轻!

分组的作用,不在查询每个组内的具体数据。而其作用主要是在分组统计上:

### 合计函数

此时需要使用 统计函数(合计函数)加以配合!

合计函数例如:count() 可以统计结果中的记录数,但是一旦使用了分组查询,则只会统计组内的数据!

count(),统计记录数。典型的使用是 count(\*),但是除了\*之外,是可以使用字段名的!

其中,只要记录存在,则count(\*)就会统计到数据,而如果相应的字段为null,则count(字段)不会统计上数据:

看下面对 gender 的统计结果:

sum(字段表达式),统计和,对某个字段求和!

avg(),平均值

max(字段表达式),最大值

min(字段表达式),最小值

group\_concat(字段表达式),组内连接字符串

### 分组排序

默认的分组后会按照 分组字段对结果进行排序。可以group by子句指定排序的方式(升序ASC和降序DESC)

### 多字段分组

使用逗号分隔开多个分组字段即可!统计时,会按照多个字段的组合分组生成结果!

例如:统计每个班级内的 男生和女生的数量!

如果是多字段分组,需要查看每个分组的的详细情况:

可以使用 关键字 with rollup 关键字来回滚统计:

having子句,条件子句
-------------

功能上与where类似,都是条件子句!

主要的区别,在于执行时机:

执行时机:

where,是开始时,从数据源中检索数据的条件。

而 having,是在筛选,分组之后,在得到的结果中,再次进行筛选的语法!

因此 having的结果 一定是 where 已经 过滤之后的结果!

having的作用在于,对结果进行二次处理!

例如:找到 平均身高 高于 175cm的 班级:

每个班级的平均身高:

查询条件是 avg(height)之后的结果:

此时,where和groupby已经执行结束!可以使用 having 进行二次过滤:

为啥要有 having:where没有办法与 合计函数一起使用!原因在于执行 顺序问题!

典型的应该使用别的形式为 having完成条件表达式:

order by 排序子句
-------------

对结果进行排序的语句!

order by 字段名 [asc|desc], [字段名 [asc|desc],]

可见 可按照多个字段进行排序

原则是,先按照第一个字段进行排序,如果字段值相同,则采用第二个,以此类推!

limit 子句
--------

限制 结果记录数的子句!

从 所有的结果中 ,选择部分结果的 子句!

上面的是记录的位置:

可以从 某个位置开始,取得多少条!

limit start, size;

start:起始位置

size,取得的记录数

注意,第二个参数是,长度,而不是 终止位置!

还有一个简写,省略start起始位置,表示从第一条记录开始:

分页!

select的子句的总结
------------

select子句的全部子句

### 书写顺序

字段表达式,from子句,where子句,group by子句,having子句,order by子句,limit子句。

书写顺序,与 执行顺序!几乎是一样的!

### 执行顺序

from

where

group by

字段表达式,合计函数表达式

having

order by

limit

书写顺序不能错,但是子句几乎都可以省略!省略表示不发生操作!

![](FBE9DDCE204999C9798D9E646DB0DE29.png)

上一篇: [20 子查询,sub-query](http://arick.leanote.com/post/20-%E5%AD%90%E6%9F%A5%E8%AF%A2%EF%BC%8Csub-query)